package com.itec.learn.java.design.factory.method;

import com.itec.learn.java.design.factory.Pizza;

/**
 * 给披萨店使用框架，约束披萨的制作过程，但是生产哪种类型的披萨有具体的加盟店决定
 *
 * orderPizza()方法对Pizza对象做了许多事情（准备、烘烤、切片、装盒）
 * 但是Pizza对象是抽象的，orderPizza()并不知道哪些实际的具体类参与进来了。
 * 换句话说，这就是“解耦”（decouple）！
 * @author chenyiqun
 */
public abstract class AbstractPizzaStore {

    /**
     * 创建了一套“框架”
     * 定义了一整套制作披萨的流程，把不变的部分固定住，同时把可变的部分留给子类去实现，保持了弹性。
     * 符合“开闭原则”，对扩展开放，对修改关闭
     * @param type
     * @return
     */
    public Pizza orderPizza(String type){
        // 对扩展开放，允许子类扩展接口
        //这些是“变化”的部分， 各个加盟店“差异”的部分，可以选择不同风味的披萨
        Pizza pizza = createPizza(type);

        //对修改变比，禁止修改固定的部分

        //约束披萨的制作过程，这些是“不变”的部分，加盟店需要在订单的处理流程上保持一致！
        //“秘方”过程不能被子类变更，从而保证产品的质量
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }

    /**
     * 创建哪种披萨还是有加盟店决定
     * @param type
     * @return
     */
    public abstract Pizza createPizza(String type);
}
